import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';
import router from './router';
import store from './store';
import http from './util/http';
import VueRouter from "vue-router";

Vue.use(ElementUI);

// 使用封装的http而非axios
Vue.prototype.$http = http;
Vue.prototype.httpUrl = 'http://localhost:8090';

// 从localStorage获取用户信息和菜单数据
const menus = JSON.parse(localStorage.getItem('permissionMenus') || '[]');
const user = JSON.parse(localStorage.getItem('currentUser') || '{}');
const token = localStorage.getItem('jwt_token');
const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true';

// 初始化Vuex状态
if (store._mutations['permission/SET_MENU_LIST']) {
  store.commit('permission/SET_MENU_LIST', menus);
}

if (store._mutations['user/SET_USER'] && isLoggedIn && token) {
  store.commit('user/SET_USER', user);
  store.commit('user/SET_TOKEN', token);
}

// 添加请求拦截器，自动添加token
Vue.prototype.http = function(config) {
  // 使用http实例
  return http(config);
};

// 全局错误处理
Vue.config.errorHandler = function(err, vm, info) {
  console.error('Vue全局错误:', err, info);
  
  // 处理路由相关错误
  if (err.message && (err.message.includes('navigation') || err.message.includes('route'))) {
    console.warn('检测到路由错误，可能需要重新加载路由');
    
    // 尝试恢复路由
    if (isLoggedIn && token) {
      console.log('检测到路由错误，尝试刷新页面...');
      if (!window.routeErrorHandled) {
        window.routeErrorHandled = true;
        // 为防止无限循环，设置标记
        setTimeout(() => {
          window.location.href = '/statistics';
        }, 500);
      }
    }
  }
};

// 全局导航错误处理
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function(location) {
  return originalPush.call(this, location).catch(err => {
    console.warn('导航错误:', err);
    if (err.name !== 'NavigationDuplicated') {
      // 对于非重复导航错误，尝试恢复
      if (isLoggedIn && token && !window.navErrorHandled) {
        window.navErrorHandled = true;
        console.log('尝试重新获取菜单数据...');
        // 使用setTimeout防止无限循环
        setTimeout(() => {
          // 尝试从后端重新获取菜单
          const user = JSON.parse(localStorage.getItem('currentUser') || '{}');
          if (user && user.role !== undefined) {
            http.get(`/menu/list/${user.role}`)
              .then(response => {
                if (response.data && response.data.code === 200) {
                  const menus = response.data.data || [];
                  console.log('重新获取菜单成功:', menus);
                  localStorage.setItem('permissionMenus', JSON.stringify(menus));
                  
                  // 重新加载路由
                  store.dispatch('permission/generateRoutes', menus).then(() => {
                    // 在路由生成后，尝试跳转到统计页面作为安全选项
                    setTimeout(() => {
                      window.location.href = '/statistics';
                    }, 300);
                  });
                }
              })
              .catch(() => {
                // 如果请求失败，跳转到统计页面
                window.location.href = '/statistics';
              })
              .finally(() => {
                // 清除标记
                setTimeout(() => {
                  window.navErrorHandled = false;
                }, 2000);
              });
          }
        }, 500);
      }
      return Promise.reject(err);
    }
    // 对于重复导航，返回已解决的promise
    return Promise.resolve();
  });
};

new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App),
  async created() {
    console.log('Vue实例created，当前路由路径:', this.$route.path);
    // 从本地存储恢复用户状态和路由
    try {
      if (isLoggedIn && token) {
        console.log('用户已登录，正在恢复路由状态...');
        
        // 使用user模块的方法恢复用户状态和路由
        // 这会包括从后端重新获取最新的菜单数据
        await store.dispatch('user/restoreUserInfoAndRoutes');
        console.log('用户状态和路由恢复完成');
        
        // 输出最新的路由信息
        console.log('当前已注册路由:', router.getRoutes().map(r => r.path));
          
        // 如果当前是登录页，重定向到首页
        if (this.$route.path === '/login') {
          // 获取最新的菜单数据
          const menuString = localStorage.getItem('permissionMenus');
          let targetPath = '/';
          
          if (menuString) {
            try {
              const menus = JSON.parse(menuString);
              if (menus && menus.length > 0) {
                const firstMenu = menus[0];
                if (firstMenu && firstMenu.path) {
                  targetPath = firstMenu.path.startsWith('/') ? firstMenu.path : '/' + firstMenu.path;
                }
              }
            } catch (e) {
              console.error('解析菜单数据失败:', e);
            }
          }
          
          console.log('尝试导航到:', targetPath);
          // 使用导航到目标路径
          setTimeout(() => {
            this.$router.push(targetPath).catch(err => {
              console.warn('初始导航失败:', err);
              // 如果导航失败，尝试导航到根路径
              if (targetPath !== '/') {
                this.$router.push('/').catch(e => console.warn('导航到根路径也失败:', e));
              }
            });
          }, 300); // 给路由一些时间注册
        }
      }
    } catch (error) {
      console.error('恢复路由状态失败:', error);
      // 出错时清理登录状态
      store.dispatch('user/logout');
    }
  },
  mounted() {
    console.log('Vue实例mounted，当前路由路径:', this.$route.path);
    
    // 输出路由调试信息
    console.log('-------路由调试信息-------');
    console.log('当前已注册路由:', router.getRoutes().map(r => ({ name: r.name, path: r.path })));
    console.log('当前激活路由:', this.$route.path);
    console.log('-------------------------');
  }
});